﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using Config.Enum;
using PaymentBLL;
using WebTriple7.Class;

namespace WebTriple7.Service
{
    /// <summary>
    /// Thao tác với người dùng, mua gói vàng, ...
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    [System.Web.Script.Services.ScriptService]
    public class WSUser : System.Web.Services.WebService
    {

        /// <summary>
        /// Mua vàng qua Goplay bởi gói định nghĩa
        /// </summary>
        /// <param name="id"></param>
        /// /// <param name="gateWayId"></param>
        /// <returns>
        /// >0: Thành công
        /// -1: Chưa đăng nhập
        /// 
        /// </returns>
        [WebMethod(EnableSession = true)]
        public string GoBuyItemIn(int id, int gateWayId)
        {            
            if (!Utils.UserUtils.IsLogin)
                return "-1|";
            int accId = Utils.UserUtils.AccountId;
            string accName = Utils.UserUtils.UserName;
            int accType = Utils.UserUtils.TypeAccount;

            var gateWay = (GateWay)gateWayId;
            var gatePayment = new GateWayPayment(gateWay);
            var gate = gatePayment.GetGateWayInfo();

            var ctrItem = new CtrItem();
            var item = ctrItem.SelectItemIn(id);

            if (item.AmountIn > gatePayment.GetBlance().Data)
                return "-2|Tài khoản của bạn không đủ để thanh toán";

            int status = -1;
            int? resultCode = null;
            int ret = 0;
            var ctrl = new CtrLogItemIn();
            long? logId = 0;
            ret=ctrl.InsertLogItemIn(accId, accName, accType, gate.Id, gate.Name, gate.Unit, accId + "|" + accName,
                                 string.Empty, item.Id, item.Name, item.AmountIn, item.VndIn, item.Quantity, item.ReceiveAu,
                                 item.ReceiveAg, status, null, "Mua gói vàng", ref logId);
            if (!(ret > 0))
                return "0|Lỗi kết nối với máy chủ";//Lỗi xảy ra
            ////Trừ tiền                 
            var resultPayment = gatePayment.DeductMoney(item.AmountIn, item.Id, logId ?? 0);

            resultCode = resultPayment.Code;
            if (resultPayment.Status > 0)
            {                
                var ctr = new CtrAccount();
                ret = ctr.AddAuAgAccount(accId, 1, item.ReceiveAu, item.ReceiveAg, "Mua gói vàng từ"+gate.Name+", LogId: " + logId);
                string mess = "";
                if (ret > 0)
                    status = 1;//Thanh toán thành công, cộng vàng thành công
                else
                {
                    mess = " (Thanh toán thành công, cộng vàng không thành công)";
                    status = 2;//Thanh toán thành công, cộng vàng không thành công
                }
                ctrl.UpdateLogItemIn(logId ?? 0, status, resultCode, "Mua gói vàng thành công" + mess + ": " + resultPayment.Data);
                return "1|" + mess;
            }
            else
            {

                status = 0;
                ctrl.UpdateLogItemIn(logId ?? 0, status, resultCode,
                                     "Lỗi mua gói vàng: " + resultPayment.Data);
                return resultPayment.Status + "|" + resultPayment.Mess;
            }
        }
        /// <summary>
        /// Mua vàng lẻ
        /// </summary>
        /// <param name="vcoin"></param>
        /// <returns></returns>
        [WebMethod(EnableSession = true)]
        public string GoBuyItemSingle(int money, int gateWayId)
        {
            if (!Utils.UserUtils.IsLogin)
                return "-1|Bạn đã hết phiên đăng nhập";
            int accId = Utils.UserUtils.AccountId;
            string accName = Utils.UserUtils.UserName;
            int accType = Utils.UserUtils.TypeAccount;

            var gateWay = (GateWay) gateWayId;
            var gatePayment = new GateWayPayment(gateWay);
            var gate = gatePayment.GetGateWayInfo();

            if (money > gatePayment.GetBlance().Data)
                return "-2|Tài khoản của bạn không đủ để thanh toán";

            var au = (Int32)Math.Round(money * gate.ReceiveAu / gate.AmountIn, 0);
            var ag = (Int32)Math.Round(money * gate.ReceiveAg / gate.AmountIn, 0);
            var vnd = (Int32)Math.Round(money * gate.ReceiveAg / gate.VndIn, 0);

            long? logId = 0;
            var ctrl = new CtrLogPaymentGatewayIn();
            int status = -1;
            int? resultCode = null;
            int ret = 0;

            ret=ctrl.InsertLogPaymentGatewayIn(accId, accName, accType, gate.Id, gate.Name, gate.Unit, accId + "|" + accName,
                                           string.Empty, money, vnd, au, ag, status, resultCode, "Nạp vàng lẻ",
                                           ref logId);
            if (!(ret > 0))
                return "0|Lỗi kết nối với máy chủ";//Lỗi xảy ra

            //Trừ tiền            
            
            var resultPayment = gatePayment.DeductMoney(money,0, logId ?? 0);

            resultCode = resultPayment.Code;
            if (resultPayment.Status > 0)
            {                
                var ctr = new CtrAccount();
                ret=ctr.AddAuAgAccount(accId, 1, au, ag, "Mua vàng lẻ từ "+gate.Name+", LogId: " + logId);
                string mess = "";
                if (ret > 0)
                    status = 1;//Thanh toán thành công, cộng vàng thành công
                else
                {
                    mess = " (Thanh toán thành công, cộng vàng không thành công)";
                    status = 2;//Thanh toán thành công, cộng vàng không thành công
                }

                ctrl.UpdateLogPaymentGatewayIn(logId ?? 0, status, resultCode,
                                               "Mua mua vàng lẻ" + mess + ": " + resultPayment.Data);
                    

                return status+"|" + mess;
            }
            else
            {
                status = 0;
                ctrl.UpdateLogPaymentGatewayIn(logId ?? 0, status, resultCode, "Lỗi mua vàng lẻ: " + resultPayment.Data);
                return resultPayment.Status + "|" + resultPayment.Mess;    
            }            
            
            
        }



        /// <summary>
        /// Đổi vàng ra tiền bởi gói định nghĩa
        /// </summary>
        /// <param name="id"></param>
        /// /// <param name="gateWayId"></param>
        /// <returns>
        /// >0: Thành công
        /// -1: Chưa đăng nhập
        /// 
        /// </returns>
        [WebMethod(EnableSession = true)]
        public string GoBuyItemOut(int id, int gateWayId)
        {
            if (!Utils.UserUtils.IsLogin)
                return "-1|";
            var ctr = new CtrAccount();
            int accId = Utils.UserUtils.AccountId;
            string accName = Utils.UserUtils.UserName;
            int accType = Utils.UserUtils.TypeAccount;

            var gateWay = (GateWay)gateWayId;
            var gatePayment = new GateWayPayment(gateWay);
            var gate = gatePayment.GetGateWayInfo();

            var ctrItem = new CtrItem();
            var item = ctrItem.SelectItemOut(id);
            int statusLog = -1;
            int? resultCode = null;
            int ret = 0;
            var ctrl = new CtrLogItemOut();
            long? logId = 0;
            ret = ctrl.InsertLogItemOut(accId, accName, accType, gate.Id, gate.Name, gate.Unit, accId + "|" + accName,
                                 string.Empty, item.Id, item.Name, item.AuOut, item.AgOut, item.ReceiveAmount, item.VndOut,
                                 item.Quantity, statusLog, null, "Đổi vàng lấy "+gate.Unit, ref logId);
            if (!(ret > 0))
                return "0|Lỗi kết nối với máy chủ";//Lỗi xảy ra

            //Trừ vàng
            ret = ctr.SubAuAgAccount(accId, 1,item.AuOut, item.AgOut, "Đổi vàng ra gói " + gate.Unit + "(" + gate.Name + ")");


            if (ret > 0)
            {
                var resultPayment = gatePayment.InputMoney(item.ReceiveAmount, logId ?? 0);
                resultCode = resultPayment.Code;

                string mess = "";
                if (resultPayment.Status >= 0)
                    statusLog = 1;
                else
                {
                    statusLog = 2;
                    mess = " (Trừ vàng thành công, thanh toán không thành công)";
                }
                ctrl.UpdateLogItemOut(logId ?? 0, statusLog, resultCode,
                                                "Đổi vàng ra gói " + gate.Unit + " (" + gate.Name + ")(" + mess + "): " + resultPayment.Data);
                return statusLog + "|" + resultPayment.Mess;
            }
            else
            {
                statusLog = 0;
                ctrl.UpdateLogItemOut(logId ?? 0, statusLog, resultCode,
                                                "Lỗi đổi vàng ra gói "+gate.Unit);
                return "0|Lỗi kết nối với máy chủ";
            }
        }
        /// <summary>
        /// Đổi vàng ra Vcoin
        /// </summary>
        /// <param name="au"></param>
        /// <param name="gateWayId"></param>
        /// <returns></returns>
        [WebMethod(EnableSession = true)]
        public string GoBuySingleOut(int au, int gateWayId)
        {
            if (!Utils.UserUtils.IsLogin)
                return "-1|Bạn đã hết phiên đăng nhập";
            var ctr = new CtrAccount();
            int accId = Utils.UserUtils.AccountId;
            string accName = Utils.UserUtils.UserName;
            int accType = Utils.UserUtils.TypeAccount;


            var gateWay = (GateWay)gateWayId;
            var gatePayment = new GateWayPayment(gateWay);
            var gate = gatePayment.GetGateWayInfo();

            if (ctr.SelectAccountInfo(accId).Au < au)
                return "-2|Số vàng hiện tại của bạn không đủ";
            var amount = (Int32)Math.Round(au * gate.ReceiveAmount / gate.AuOut, 0);

            var vnd = (Int32)Math.Round(au * gate.ReceiveAmount / gate.VndOut, 0);
            long? logId = 0;
            var ctrl = new CtrLogPaymentGatewayOut();
            int statusLog = -1;
            int? resultCode = null;
            var ret=ctrl.InsertLogPaymentGatewayOut(accId, accName, accType, gate.Id, gate.Name, gate.Unit,
                                            accId + "|" + accName, string.Empty, au, 0, amount, vnd, statusLog, resultCode,
                                            "Đổi vàng lẻ", ref logId);
            if (ret <= 0)
                return "0|Lỗi kết nối với máy chủ";
            //Trừ vàng
            ret = ctr.SubAuAgAccount(accId, 1, au, 0, "Đổi vàng ra "+gate.Unit+"("+gate.Name+")");
            

            if (ret > 0)
            {                
                var resultPayment = gatePayment.InputMoney(amount, logId ?? 0);
                resultCode = resultPayment.Code;

                string mess = "";
                if (resultPayment.Status >= 0)
                    statusLog = 1;
                else
                {
                    statusLog = 2;
                    mess = " (Trừ vàng thành công, thanh toán không thành công)";
                }
                ctrl.UpdateLogPaymentGatewayOut(logId ?? 0, statusLog, resultCode,
                                                "Đổi vàng lẻ thành "+gate.Unit+" ("+gate.Name+")(" +mess+"): "+resultPayment.Data);
                return statusLog + "|" + resultPayment.Mess;
            }
            else
            {
                statusLog = 0;
                ctrl.UpdateLogPaymentGatewayOut(logId ?? 0, statusLog, resultCode,
                                                "Lỗi đổi vàng lẻ");
                return "0|Lỗi kết nối với máy chủ";
            }

        }

    }
}
